/**
 * 测试增强的JSON解析功能
 * 
 * 这个脚本用于测试我们对通义千问返回的非标准JSON响应的处理能力
 */
require('dotenv').config();
const fs = require('fs');
const path = require('path');

// 模拟通义千问可能返回的各种响应格式
const testResponses = [
  // 测试场景1: 正常的JSON响应
  `[
    {
      "title": "第一章 引言",
      "startIndex": 0,
      "endIndex": 1200
    },
    {
      "title": "第二章 方法",
      "startIndex": 1201,
      "endIndex": 2500
    }
  ]`,
  
  // 测试场景2: 带有前缀的JSON
  `以下是文档结构:
  [
    {
      "title": "第一章 引言",
      "startIndex": 0,
      "endIndex": 1200
    }
  ]`,
  
  // 测试场景3: 带有后缀的JSON
  `[
    {
      "title": "第一章 引言",
      "startIndex": 0,
      "endIndex": 1200
    }
  ]
  希望这对您有所帮助！`,
  
  // 测试场景4: 带有前后缀的JSON
  `根据您提供的文档，我分析出以下结构:
  [
    {
      "title": "第一章 引言",
      "startIndex": 0,
      "endIndex": 1200
    }
  ]
  如果需要更详细的分析，请提供更多内容。`,
  
  // 测试场景5: 完全非JSON格式的响应
  `什么都没有！不过这很正常，因为您提供的文档可能没有明确的章节结构。
  我建议您可以手动划分章节，例如：
  第一章: 引言 (从开始到第1200个字符)
  第二章: 方法 (从第1201到第2500个字符)`,
  
  // 测试场景6: 格式错误的JSON
  `[
    {
      "title": "第一章 引言",
      "startIndex": 0,
      "endIndex": 1200,
    }, // 注意这里有多余的逗号
    {
      "title": "第二章 方法",
      "startIndex": 1201,
      "endIndex": 2500
    }
  ]`,
  
  // 测试场景7: HTML格式的响应
  `<!DOCTYPE html>
  <html>
  <head>
    <title>响应</title>
  </head>
  <body>
    <p>根据您提供的文档，我分析出以下结构:</p>
    <pre>
    [
      {
        "title": "第一章 引言",
        "startIndex": 0,
        "endIndex": 1200
      }
    ]
    </pre>
    <p>如果需要更详细的分析，请提供更多内容。</p>
  </body>
  </html>`,
  
  // 测试场景8: 包含HTML标签但不是完整HTML文档的响应
  `<div>
    <p>文档分析结果：</p>
    <ul>
      <li>第一章: 引言</li>
      <li>第二章: 方法</li>
    </ul>
  </div>`
];

/**
 * 增强的JSON解析函数
 * @param {string} text - 需要解析的文本
 * @returns {object|null} - 解析结果或null
 */
function enhancedJSONParse(text) {
  console.log('\n尝试解析文本:', text.substring(0, 50) + '...');
  
  // 检查是否为HTML格式
  if (text.includes('<!DOCTYPE html>') || text.includes('<html>') || text.includes('</html>')) {
    console.log('📄 检测到HTML格式，尝试提取内容...');
    // 简单地移除HTML标签
    text = text.replace(/<[^>]*>?/gm, '');
    console.log('提取后的纯文本:', text.substring(0, 50) + '...');
  } else if (text.includes('<') && text.includes('>')) {
    // 检查是否包含HTML标签
    console.log('📄 检测到HTML标签，尝试提取内容...');
    text = text.replace(/<[^>]*>?/gm, '');
    console.log('提取后的纯文本:', text.substring(0, 50) + '...');
  }
  
  // 尝试直接解析
  try {
    const data = JSON.parse(text);
    console.log('✅ 成功直接解析JSON');
    return data;
  } catch (e) {
    console.log('❌ 直接解析失败:', e.message);
    
    // 尝试提取JSON部分 - 方法1: 查找第一个 [ 和最后一个 ] 之间的内容
    const startIdx = text.indexOf('[');
    const endIdx = text.lastIndexOf(']');
    
    if (startIdx !== -1 && endIdx !== -1 && startIdx < endIdx) {
      try {
        const jsonStr = text.substring(startIdx, endIdx + 1);
        const data = JSON.parse(jsonStr);
        console.log('✅ 成功提取并解析JSON部分 (方法1)');
        return data;
      } catch (e2) {
        console.log('❌ 提取JSON部分失败 (方法1):', e2.message);
      }
    }
    
    // 尝试提取JSON部分 - 方法2: 使用正则表达式
    const jsonMatch = text.match(/\[\s*\{[\s\S]*\}\s*\]/);
    if (jsonMatch) {
      try {
        const data = JSON.parse(jsonMatch[0]);
        console.log('✅ 通过正则表达式成功提取并解析JSON (方法2)');
        return data;
      } catch (e3) {
        console.log('❌ 正则表达式提取JSON失败 (方法2):', e3.message);
      }
    }
    
    // 尝试手动修复常见JSON错误
    try {
      // 修复多余的逗号
      const fixedText = text.replace(/,(\s*[\]}])/g, '$1');
      const data = JSON.parse(fixedText);
      console.log('✅ 修复JSON格式后成功解析 (方法3)');
      return data;
    } catch (e4) {
      console.log('❌ 修复JSON格式失败 (方法3):', e4.message);
    }
  }
  
  // 如果是非JSON格式，尝试提取结构化信息
  if (text.includes('章') || text.includes('节')) {
    console.log('📝 检测到非JSON格式，尝试提取结构化信息...');
    
    // 简单的提取逻辑 - 查找可能的章节标题
    const chapterRegex = /(?:第[一二三四五六七八九十百千万]+[章节]|章节\s*\d+|[0-9]+\.\s*)[^，。:：\n]+([:：])?[^，。\n]*/g;
    
    const chapters = [];
    let match;
    while ((match = chapterRegex.exec(text)) !== null) {
      chapters.push({
        title: match[0].trim(),
        startIndex: 0,  // 这里只是示例，实际应用中需要更复杂的逻辑确定索引
        endIndex: 1000
      });
    }
    
    if (chapters.length > 0) {
      console.log(`✅ 从非JSON文本中提取了 ${chapters.length} 个章节`);
      return chapters;
    }
  }
  
  console.log('❌ 所有解析方法均失败');
  return null;
}

// 测试每种响应
console.log('=== 测试增强的JSON解析功能 ===');
testResponses.forEach((response, index) => {
  console.log(`\n🧪 测试场景 ${index + 1}:`);
  const result = enhancedJSONParse(response);
  
  if (result) {
    console.log('✅ 解析成功!');
    console.log('📊 结果:', JSON.stringify(result).substring(0, 100) + '...');
  } else {
    console.log('❌ 解析失败!');
  }
});

console.log('\n=== 测试完成 ==='); 